class Led {
    constructor() {
        this.buf = Buffer.alloc(65535);
        this.len = 0;
        this.rootSizeIndex = 4;
        this.chapterSizeIndex = 36;
        this.regionSizeIndex = 68;
        this.leafSizeIndex = 108;
        this.windowSizeIndex = 120;
    }

    byteFill(val) {
        this.buf.writeUInt8(val , this.len);
        this.len += 1;
    }

    shortFill(val) {
        this.buf.writeUInt16LE(val , this.len);
        this.len += 2;
    }

    intFill(val) {
        this.buf.writeUInt32LE(val , this.len);
        this.len += 4;
    }

    addSize(pos , val) {
        let n = this.buf.readUInt32LE(pos)+val;
        this.buf.writeUInt32LE(n , pos);
    }

    /** Root
        Id	2	节目代码  0x21：发送节目  0x22：下载节目
        Type	2	节目类型  1：单路数据  2：RG双路数据
        Size	4	数据长度，TRoot长度+所有子数据长度
        Count	4	章节数量
        Survive	4	存在时间长度
        Flag	2	标志，置0
        Reserved	2	保留，置0
     */
    makeRoot() {
        this.shortFill(0x21);
        this.shortFill(2);
        this.intFill(20); //root的字节size
        this.intFill(1);
        this.intFill(0x7FFFFFFF);
        this.shortFill(0);
        this.shortFill(0);
    }

    /** chapter
    Id	2	章节标识代码 =0x3F
    No	2	置0
    Wait	2	是否等待播放完成 =1等待; =0到时间就切
    Repeat	2	置0
    Count	2	区域数量
    Reserved	2	存在时间长度
    Time	4	时间长度（毫秒）
    Size	4	数据长度，TChapter长度+所有子数据长度
    Others	20	播放计划相关参数，全部置0
    */
    addChapter() {
        this.shortFill(0x3F);
        this.shortFill(0);
        this.shortFill(1);
        this.shortFill(0);
        this.shortFill(1);
        this.shortFill(0xFFFF);
        this.intFill(0x7FFFFFFF);
        this.intFill(40); //chapter的字节size
        this.intFill(0);
        this.intFill(0);
        this.intFill(0);
        this.intFill(0);
        this.intFill(0);
        
        // rootSize加大一个chapter,是40个字节
        this.addSize(this.rootSizeIndex , 40);
    }

    /* Region
    Id	2	区域标识代码 =0x3E
    No	2	置0
    Over	2	置0
    Count	2	页面数量
    Size	4	数据长度，TChapter长度+所有子数据长度
    Rect	Left	4	区域左上角X坐标（置0）
        Top	4	区域左上角Y坐标（置0）
        Right	4	区域右下角X坐标（置显示屏宽度）
        Bottom	4	区域右下角Y坐标（置显示屏高度）
    Reserved	4	置0
    */
    addRegion() {
        this.shortFill(0x3E);
        this.shortFill(0);
        this.shortFill(0);
        this.shortFill(1);
        this.intFill(32); // regionSize
        this.intFill(0);
        this.intFill(0);
        this.intFill(256);
        this.intFill(32);
        this.intFill(0);

        // chapter和root加大一个region,是32个字节
        this.addSize(this.rootSizeIndex , 32);
        this.addSize(this.chapterSizeIndex , 32);
    }

    /* leaf
    Id	2	页面标识代码 =0x30
    No	2	置0
    Wait	2	是否等待播放完成 =1等待; =0到时间就切
    Serial	2	置0
    Count	2	对象数量
    Reserved	2	存在时间长度
    Time	4	时间长度（毫秒）
    Size	4	数据长度，TLeaf长度+所有子数据长度
    Reserved1	2	置0
    Reserved2	2	置0
    */
    addLeaf() {
        this.shortFill(0x30);
        this.shortFill(0);
        this.shortFill(1);
        this.shortFill(0);
        this.shortFill(1);
        this.shortFill(0xFFFF);
        this.intFill(0x7FFFFFFF);
        this.intFill(24); // leaf的字节size
        this.shortFill(0);
        this.shortFill(0);

        // chapter、root、region加大一个leaf,是24个字节
        this.addSize(this.rootSizeIndex , 24);
        this.addSize(this.chapterSizeIndex , 24);
        this.addSize(this.regionSizeIndex , 24);
    }

    /*
    Id	2	章节标识代码 =0x3C
    Transparent	1	置1
    Border	1	置0
    Size	4	数据长度，TWindows长度+所有子数据长度
    Rect	Left	4	区域左上角X坐标（置0）
        Top	4	区域左上角Y坐标（置0）
        Right	4	区域右下角X坐标（置显示屏宽度）
        Bottom	4	区域右下角Y坐标（置显示屏高度）
    Method	1	置0
    Speed	1	置0
    Count	2	子字符串对象数量
    */
    addWindow() {
        this.shortFill(0x3C);
        this.byteFill(1);
        this.byteFill(1);
        this.intFill(28); // Window的字节size
        this.intFill(0);
        this.intFill(0);
        this.intFill(256);
        this.intFill(16);
        this.byteFill(0);
        this.byteFill(0);
        this.shortFill(1);

        // chapter、root、region、leaf加大一个window,是28个字节
        this.addSize(this.rootSizeIndex , 28);
        this.addSize(this.chapterSizeIndex , 28);
        this.addSize(this.regionSizeIndex , 28);
        this.addSize(this.leafSizeIndex , 28);
    }

    /*
    Id	2	章节标识代码 =0x33
    inMethod	1	引入方式
    outMethod	1	引出方式
    stopMethod	1	停留方式
    Reserved	1	置0
    inSpeed	2	引入速度
    outSpeed	2	引出速度
    StopSpeed	2	停留速度
    stopTime	4	停留时间（毫秒）
    Stopx	4	置0
    Size	4	数据长度，TString长度+所有子数据长度
    Color	4	文字颜色 红=0x00FF 绿=0xFF00 黄=0xFFFF
    Fontset	2	字符集0=16点阵 1=24点阵
    Reserved2	2	置0
    Str	N	内码字符串内容，必须以\0结尾，长度必须是4的倍数
    */
    addString(str) {
        this.shortFill(0x33); // Id	2	章节标识代码 =0x33
        this.byteFill(1); // inMethod	1	引入方式
        this.byteFill(2); // outMethod	1	引出方式
        this.byteFill(0); // stopMethod	1	停留方式
        this.byteFill(0); // Reserved	1	置0
        this.shortFill(1); // inSpeed	2	引入速度
        this.shortFill(1); // outSpeed	2	引出速度
        this.shortFill(1); // StopSpeed	2	停留速度
        this.intFill(0x7FFFFFFF); // stopTime	4	停留时间（毫秒）
        this.intFill(0); // Stopx	4	置0
        this.intFill(40); // Size	4	数据长度，TString长度+所有子数据长度
        this.intFill(0x00FF); // Color	4	文字颜色 红=0x00FF 绿=0xFF00 黄=0xFFFF
        this.shortFill(0); // Fontset	2	字符集0=16点阵 1=24点阵
        this.shortFill(0); // Reserved2	2	置0
        this.byteFill(0x31); // 1	内码字符串内容，必须以\0结尾，长度必须是4的倍数
        this.byteFill(0x32); // 2
        this.byteFill(0x33); // 3
        this.byteFill(0x34); // 4
        this.byteFill(0x0);  // \0
        this.byteFill(0x0);  // \0
        this.byteFill(0x0);  // \0
        this.byteFill(0x0);  // \0

        // chapter、root、region、leaf、windows加大一个string,是N个字节
        this.addSize(this.rootSizeIndex , 40);
        this.addSize(this.chapterSizeIndex , 40);
        this.addSize(this.regionSizeIndex , 40);
        this.addSize(this.leafSizeIndex , 40);
        this.addSize(this.windowSizeIndex , 40);
    }

    show() {
        return this.buf.slice(0,this.len);
    }

}

// let s = new Led();
// s.makeRoot();
// s.addChapter();
// s.addRegion();
// s.addLeaf();
// s.addWindow();
// s.addString();

// console.log(s.show().toString('hex').toUpperCase() );
console.log(Buffer.from('中国').toString('hex')) 
function a(){
    let s = new Led();
    s.makeRoot();
    s.addChapter();
    s.addRegion();
    s.addLeaf();
    s.addWindow();
    s.addString();
    return s.show()
    console.log(s.show().toString('hex').toUpperCase() );
}
module.exports = {
    a
  }